package main

import (
	"fmt"
	"sync"
)

// 定义一个等待组对象wg
var wg = sync.WaitGroup{}

// 定义safeData结构体，其中含有一个map属性和一个信号量属性
type safeData struct {
	content map[int]int
	lock    sync.RWMutex
}

// 向safeData中添加一条数据
func (m *safeData) addEntry(k int) {
	// 延迟处理
	defer func() {
		// 异常捕获，保证不会因当前协程中的异常而导致程序崩溃
		if err := recover(); err != nil {
			fmt.Printf("出错啦，k=%d, %v\n", k, err)
		} else {
			fmt.Println("已添加，k = ", k)
		}
		// 等待组计数器减一
		wg.Done()
	}()

	// 主要逻辑，加锁保护，并向map中添加一个key-value键值对
	m.lock.Lock()
	// 保证解锁对象被释放
	m.lock.Unlock()

	// 注意此处的处理，当k = 10时，会抛出除数为10的异常
	m.content[k] = k / (k - 10)
}

func main8() {
	// 创建safeData实例
	data := safeData{}

	// 等待组计数器加10
	wg.Add(10)

	data.content = make(map[int]int, 10)

	//循环10次，启动子协程
	for i := 1; i <= 10; i++ {
		go func(i int) {
			// 向data中添加数据条目
			data.addEntry(i)
		}(i)
	}

	wg.Wait()
}
